#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )
/**
 * ${copyright}
 * Copyright (c) 2019. All Rights Reserved.
 */
package ${package}.common.bean.vo;

import ${package}.common.bean.po.Role;
import ${package}.common.emum.UserStatusEnum;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Description: security的用户详情类
 *
 * @author ywh
 * @date 2019/8/6 15:28
 *
 * <pre>
 *              ${copyright}
 *      Copyright (c) 2019. All Rights Reserved.
 * </pre>
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SecurityUser implements UserDetails,Serializable {

    private static final long serialVersionUID = 3001377113961406647L;

    /**
     * 主键id
     */
    @ApiModelProperty("主键id")
    private Long id;
    /**
     *用户的名字
     */
    @ApiModelProperty("用户的名字")
    private String username;
    /**
     *用户的密码
     */
    @ApiModelProperty("用户的密码")
    @JSONField(serialize = false)
    private String password;
    /**
     *用户状态，1 表示有效用户， 0表示无效用户
     */
    @ApiModelProperty("用户状态，1 表示有效用户， 0表示无效用户")
    private Integer status;
    /**
     *用户姓名
     */
    @ApiModelProperty("用户姓名")
    private String nickname;
    /**
     *电子邮箱
     */
    @ApiModelProperty("电子邮箱")
    private String email;
    /**
     *电话
     */
    @ApiModelProperty("电话")
    private String telephone;
    /**
     *职位
     */
    @ApiModelProperty("职位")
    private String job;
    /**
     *用户组主键(可以是部门，公司)
     */
    @ApiModelProperty("用户组主键(可以是部门，公司)")
    private Long groupId;
    /**
     *用户头像
     */
    @ApiModelProperty("用户头像")
    private String icon;
    /**
     *创建时间
     */
    @ApiModelProperty("创建时间")
    private Date createdate;
    /**
     *更新时间
     */
    @ApiModelProperty("更新时间")
    private Date updatedate;
    /**
     *关联角色表
     */
    @ApiModelProperty("关联角色表")
    private List<Role> roleArrayList;
    /**
     * 用户的权限，可以把用户的角色信息的集合先放进来，角色代表着权限
     */
    @ApiModelProperty("用户的权限，可以把用户的角色信息的集合先放进来，角色代表着权限")
    private Collection<GrantedAuthority> authorties;
    /**
     * 权限uri
     */
    @ApiModelProperty("当前用户下所有权限集合")
    private List<String> permissionUri;

    private HashMap route;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorties;
    }

    /** 设置用户角色合集 */
    public void setAuthorities(){
        authorties = Lists.newArrayList();
        if(CollectionUtils.isNotEmpty(roleArrayList)) {
            String roleJoinComma = roleArrayList.stream().map(Role::getCode).collect(Collectors.joining(","));
            authorties = AuthorityUtils.commaSeparatedStringToAuthorityList(roleJoinComma);
        }
    }

    /**
     * Description:
     * <指示用户的帐户是否已过期。过期的帐户无法通过身份验证。>
     * @author ywh
     * @date 13:57 2019/8/8
     * @return boolean true如果用户的帐户有效（即未过期）， false如果不再有效（即已过期）
     **/
    @JsonIgnore
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * Description:
     * <指示用户是锁定还是解锁。锁定的用户无法进行身份验证。>
     * @author ywh
     * @date 13:57 2019/8/8
     * @return boolean  true是未锁定，false是已锁定
     **/
    @JsonIgnore
    @Override
    public boolean isAccountNonLocked() {
        return UserStatusEnum.ENABLED.getCode().equals(this.status);
    }

    /**
     * Description:
     * <指示用户的凭据（密码）是否已过期。过期的凭据会阻止身份验证>
     * @author ywh
     * @date 13:58 2019/8/8
     * @return boolean  true如果用户的凭证有效（即未过期）， false如果不再有效（即已过期）
     **/
    @JsonIgnore
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * Description:
     * <指示用户是启用还是禁用。禁用的用户无法进行身份验证。>
     * @author ywh
     * @date 13:58 2019/8/8
     * @return boolean  true用户已启用，false用户已经禁用
     **/
    @JsonIgnore
    @Override
    public boolean isEnabled() {
        return UserStatusEnum.ENABLED.getCode().equals(this.status);
    }
}
